entry: Compute selection range correctly
authorBenjamin Otte <otte@redhat.com>
Wed, 27 Jan 2016 01:07:35 +0000 (02:07 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 27 Jan 2016 01:11:06 +0000 (02:11 +0100)
gtk_editable_get_selection_bounds() returns UTF-8 character offsets,
but gdk_pango_layout_get_clip_region() wants byte ranges, so convert
from one to the other.
With English, this is especially visible for passwords, which use ●
as the invisible character.

https://bugzilla.gnome.org/show_bug.cgi?id=761128

gtk/gtkentry.c

index 1d11bbec1d56de837bc0ae61b70c8b52bef8a4cd..2854d940bc21fc3765899fc059b957ba15666c67 100644 (file)
@@ -6373,11 +6373,14 @@ gtk_entry_draw_text (GtkEntry *entry,
 
   if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos))
     {
+      const char *text = pango_layout_get_text (layout);
+      gint start_index = g_utf8_offset_to_pointer (text, start_pos) - text;
+      gint end_index = g_utf8_offset_to_pointer (text, end_pos) - text;
       cairo_region_t *clip;
       gint range[2];
 
-      range[0] = MIN (start_pos, end_pos);
-      range[1] = MAX (start_pos, end_pos);
+      range[0] = MIN (start_index, end_index);
+      range[1] = MAX (start_index, end_index);
 
       gtk_style_context_save_to_node (context, priv->selection_node);